﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlServerCe;
using System.Data;

namespace GestionaleLib.Controller
{
    public class ctrlClienti
    {
        #region "Testata"
        #region "Proprietà"
        private Connector Connessione;
        private List<Cliente> Clienti;
        string tmpIDTessera;
        #endregion
        public enum Insert
        {
            Successo,
            Errore
        }
        public enum Edit
        {
            Successo,
            Errore
        }
        public enum Delete
        {
            Successo,
            Errore
        }
        #endregion
        #region "Metodi"
        public ctrlClienti()
        {
            Connessione = Connector.Istance();
            Clienti = new List<Cliente>();
        }

        /// <summary>
        /// Inserisce un nuova nuova tessera associata ad un cliente nel database
        /// </summary>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public Insert NuovaTesseraCliente(Tessera TesseraCliente)
        {
            //00000000-0000-0000-0000-000000000000
            try
            {
                string sql = @"INSERT INTO Tessera(Id,Codice,DataAggiornamento,Punti)
                              VALUES(@Id,@Codice,@DataAggiornamento,@Punti)";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Id", (Guid)TesseraCliente.Id);
                cmd.Parameters.AddWithValue("@Codice", TesseraCliente.Codice);
                cmd.Parameters.AddWithValue("@DataAggiornamento", TesseraCliente.DataAggiornamento);
                cmd.Parameters.AddWithValue("@Punti", TesseraCliente.Punti);

                cmd.ExecuteNonQuery();
                return Insert.Successo;
            }
            catch 
            {

                throw new ExceptionErroreInserimento();
            }

            return Insert.Successo;
        }


        /// <summary>
        /// Inserisce un nuovo cliente nel database
        /// </summary>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public Insert Nuovo(Cliente Cliente)
        {
            try
            {
                string sql = @"
                INSERT INTO Clienti(Id,RagioneSociale,Nome,Cognome,Indirizzo,Citta,Cap,Telefono,Cellulare,Fax,Email,PartitaIva,CodiceFiscale,IdTessera) 
                        VALUES (@Id,@RagioneSociale,@Nome,@Cognome,@Indirizzo
                                ,@Citta,@Cap,@Telefono,@Cellulare,@Fax,@Email
                                ,@PartitaIva,@CodiceFiscale";
                if (Cliente.Tessera != null)
                {
                    sql += ",@IdTessera)";
                }
                else
                {
                    sql += ",NULL)";
                }
                    
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Id", (Guid)Cliente.Id);
                cmd.Parameters.AddWithValue("@RagioneSociale", Cliente.RagioneSociale);
                cmd.Parameters.AddWithValue("@Nome", Cliente.Nome);
                cmd.Parameters.AddWithValue("@Cognome", Cliente.Cognome);
                cmd.Parameters.AddWithValue("@Indirizzo", Cliente.Indirizzo);
                cmd.Parameters.AddWithValue("@Citta", Cliente.Citta);
                cmd.Parameters.AddWithValue("@Cap", Cliente.Cap);
                cmd.Parameters.AddWithValue("@Telefono", Cliente.Telefono);
                cmd.Parameters.AddWithValue("@Cellulare", Cliente.Cellulare);
                cmd.Parameters.AddWithValue("@Fax", Cliente.Fax);
                cmd.Parameters.AddWithValue("@Email", Cliente.Email);
                cmd.Parameters.AddWithValue("@PartitaIva", Cliente.PartitaIva);
                cmd.Parameters.AddWithValue("@CodiceFiscale", Cliente.CodiceFiscale);
                if (Cliente.Tessera != null)
                {
                    cmd.Parameters.AddWithValue("@IdTessera", (Guid)Cliente.Tessera.Id);
                }
                else
                {
                    cmd.Parameters.AddWithValue("@IdTessera", null);
                }
                cmd.ExecuteNonQuery();
                return Insert.Successo;
            }
            catch
            {
                throw new ExceptionErroreInserimento();
            }
        }

        /// <summary>
        /// Modifica la tessera di un cliente nel database
        /// </summary>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public Edit InserisciTesseraCliente(Tessera Tessera)
        {
            try
            {
                NuovaTesseraCliente(Tessera);
                return Edit.Successo;
            }
            catch 
            {
                throw new ExceptionErroreModifica();
            }
        }

        public Delete DeleteTesseraCliente(string Tessera)
        {
            try 
	        {	        
		             string sql = @"DELETE FROM Tessera 
                             WHERE  Codice=@Codice";
                    SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                    cmd.Parameters.AddWithValue("@Codice", Tessera);

                    cmd.ExecuteNonQuery(); 
	        }
	        catch 
	        {

                throw new ExceptionErroreCancellazione();
	        }


            return Delete.Successo;
        }

        /// <summary>
        /// Modifica un cliente nel database
        /// </summary>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public Edit Modifica(Cliente Cliente)
        {
            try
            {
                string sql = @"
                UPDATE Clienti SET 
                        RagioneSociale=@RagioneSociale,Nome=@Nome,Cognome=@Cognome,Indirizzo=@Indirizzo
                                ,Citta=@Citta,Cap=@Cap,Telefono=@Telefono,Cellulare=@Cellulare,Fax=@Fax,Email=@Email
                                ,PartitaIva=@PartitaIva,CodiceFiscale=@CodiceFiscale";
                if (Cliente.Tessera != null)
                {
                    sql += ",IdTessera=@IdTessera ";
                }
                else
                {
                    sql += ",IdTessera=NULL ";
                }
                    sql += "WHERE Id=@Id";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@RagioneSociale", Cliente.RagioneSociale);
                cmd.Parameters.AddWithValue("@Nome", Cliente.Nome);
                cmd.Parameters.AddWithValue("@Cognome", Cliente.Cognome);
                cmd.Parameters.AddWithValue("@Indirizzo", Cliente.Indirizzo);
                cmd.Parameters.AddWithValue("@Citta", Cliente.Citta);
                cmd.Parameters.AddWithValue("@Cap", Cliente.Cap);
                cmd.Parameters.AddWithValue("@Telefono", Cliente.Telefono);
                cmd.Parameters.AddWithValue("@Cellulare", Cliente.Cellulare);
                cmd.Parameters.AddWithValue("@Fax", Cliente.Fax);
                cmd.Parameters.AddWithValue("@Email", Cliente.Email);
                cmd.Parameters.AddWithValue("@PartitaIva", Cliente.PartitaIva);
                cmd.Parameters.AddWithValue("@CodiceFiscale", Cliente.CodiceFiscale);
                if (Cliente.Tessera != null)
                {
                    cmd.Parameters.AddWithValue("@IdTessera", Cliente.Tessera.Id);
                }
                cmd.Parameters.AddWithValue("@Id", (Guid)Cliente.Id);
                cmd.ExecuteNonQuery();
                return Edit.Successo;
            }
            catch
            {
                throw new ExceptionErroreModifica();
            }
        }
        /// <summary>
        /// Cancella un cliente dal database
        /// </summary>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public Delete Cancella(Cliente Cliente)
        {
            try
            {
                string sql = @"
                DELETE FROM Clienti
                    WHERE Id=@Id";
                SqlCeCommand cmd = new SqlCeCommand(sql, Connessione.Connessione);
                cmd.Parameters.AddWithValue("@Id", (Guid)Cliente.Id);
                cmd.ExecuteNonQuery();
                return Delete.Successo;
            }
            catch
            {
                throw new ExceptionErroreCancellazione();
            }
        }
        /// <summary>
        /// Restituisce una lista di clienti
        /// </summary>
        /// <returns></returns>
        public List<Cliente> Seleziona()
        {
            //string CodiceTessera;
            string sql = @"
                SELECT Clienti.Id, Clienti.Nome, Clienti.Cognome, Clienti.Indirizzo, Clienti.Citta, Clienti.Cap, Clienti.Telefono, 
                    Clienti.Cellulare, Clienti.Fax, Clienti.Email, Clienti.PartitaIva, Clienti.CodiceFiscale, 
                    Clienti.RagioneSociale, Clienti.IdTessera AS IdTessera, 
                        (CASE WHEN Clienti.IdTessera IS NULL THEN '' ELSE Tessera.Codice END) AS CodiceTessera
                FROM Clienti LEFT OUTER JOIN
                    Tessera ON Clienti.IdTessera = Tessera.Id 
                ";
            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Cliente> ClientiRitorno = new List<Cliente>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Cliente ClienteRitorno = new Cliente();
                    ClienteRitorno.Id = (Guid)item["Id"];
                    ClienteRitorno.Nome = item["Nome"].ToString();
                    ClienteRitorno.Cognome = item["Cognome"].ToString();
                    ClienteRitorno.Indirizzo = item["Indirizzo"].ToString();
                    ClienteRitorno.Citta = item["Citta"].ToString();
                    ClienteRitorno.Cap = item["Cap"].ToString();
                    ClienteRitorno.Telefono = item["Telefono"].ToString();
                    ClienteRitorno.Cellulare = item["Cellulare"].ToString();
                    ClienteRitorno.Fax = item["Fax"].ToString();
                    ClienteRitorno.Email = item["Email"].ToString();
                    ClienteRitorno.PartitaIva = item["PartitaIva"].ToString();
                    ClienteRitorno.CodiceFiscale = item["CodiceFiscale"].ToString();
                    ClienteRitorno.RagioneSociale = item["RagioneSociale"].ToString();
                    //CodiceTessera = item["CodiceTessera"].ToString();
                    if (item["CodiceTessera"].ToString() == "")
                    {
                        ClienteRitorno.Tessera = null;
                    }
                    else
                    {
                        ClienteRitorno.Tessera = new Tessera()

                        {
                            Id = (Guid)item["IdTessera"],
                            Codice = item["CodiceTessera"].ToString(),
                        };
                        
                    }

                    ClientiRitorno.Add(ClienteRitorno);
                }
            }
            return ClientiRitorno;
        }
        /// <summary>
        /// Seleziona i clienti per Id
        /// </summary>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public List<Cliente> Seleziona(Cliente Cliente)
        {
            string sql = @"
                    SELECT Clienti.Id, Clienti.Nome, Clienti.Cognome, Clienti.Indirizzo, Clienti.Citta, Clienti.Cap, Clienti.Telefono, 
                    Clienti.Cellulare, Clienti.Fax, Clienti.Email, Clienti.PartitaIva, Clienti.CodiceFiscale, 
                    Clienti.RagioneSociale, Clienti.IdTessera AS IdTessera, 
                        (CASE WHEN Clienti.IdTessera IS NULL THEN '' ELSE Tessera.Codice END) AS CodiceTessera
                FROM Clienti LEFT OUTER JOIN
                    Tessera ON Clienti.IdTessera = Tessera.Id 
                WHERE Clienti.Id='" + Cliente.Id + "'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Cliente> ClientiRitorno = new List<Cliente>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Cliente ClienteRitorno = new Cliente();
                    ClienteRitorno.Nome = item["Nome"].ToString();
                    ClienteRitorno.Cognome = item["Cognome"].ToString();
                    ClienteRitorno.Indirizzo = item["Indirizzo"].ToString();
                    ClienteRitorno.Citta = item["Citta"].ToString();
                    ClienteRitorno.Cap = item["Cap"].ToString();
                    ClienteRitorno.Telefono = item["Telefono"].ToString();
                    ClienteRitorno.Cellulare = item["Cellulare"].ToString();
                    ClienteRitorno.Fax = item["Fax"].ToString();
                    ClienteRitorno.Email = item["Email"].ToString();
                    ClienteRitorno.PartitaIva = item["PartitaIva"].ToString();
                    ClienteRitorno.CodiceFiscale = item["CodiceFiscale"].ToString();

                    if (item["CodiceTessera"].ToString() == "")
                    {
                        ClienteRitorno.Tessera = null;
                    }
                    else
                    {
                        ClienteRitorno.Tessera = new Tessera()

                        {
                            Id = (Guid)item["IdTessera"],
                            Codice = item["CodiceTessera"].ToString(),
                        };

                    }


                    ClientiRitorno.Add(ClienteRitorno);
                }
            }
            return ClientiRitorno;
        }
        /// <summary>
        /// Seleziona i clienti Ragione Sociale
        /// </summary>
        /// <param name="Cliente"></param>
        /// <returns></returns>
        public List<Cliente> Seleziona(string Valore)
        {
            string sql = @"
                    SELECT Clienti.Id, Clienti.Nome, Clienti.Cognome, Clienti.Indirizzo, Clienti.Citta, Clienti.Cap, Clienti.Telefono, 
                    Clienti.Cellulare, Clienti.Fax, Clienti.Email, Clienti.PartitaIva, Clienti.CodiceFiscale, 
                    Clienti.RagioneSociale, Clienti.IdTessera AS IdTessera, 
                        (CASE WHEN Clienti.IdTessera IS NULL THEN '' ELSE Tessera.Codice END) AS CodiceTessera
                FROM Clienti LEFT OUTER JOIN
                    Tessera ON Clienti.IdTessera = Tessera.Id 
                WHERE Clienti.RagioneSociale LIKE '%" + Valore.Replace("'", "''") + "%'";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Cliente> ClientiRitorno = new List<Cliente>();
            if (dt.Rows.Count > 0)
            {
                foreach (DataRow item in dt.Rows)
                {
                    Cliente ClienteRitorno = new Cliente();
                    ClienteRitorno.Nome = item["Nome"].ToString();
                    ClienteRitorno.Cognome = item["Cognome"].ToString();
                    ClienteRitorno.Indirizzo = item["Indirizzo"].ToString();
                    ClienteRitorno.Citta = item["Citta"].ToString();
                    ClienteRitorno.Cap = item["Cap"].ToString();
                    ClienteRitorno.Telefono = item["Telefono"].ToString();
                    ClienteRitorno.Cellulare = item["Cellulare"].ToString();
                    ClienteRitorno.Fax = item["Fax"].ToString();
                    ClienteRitorno.Email = item["Email"].ToString();
                    ClienteRitorno.PartitaIva = item["PartitaIva"].ToString();
                    ClienteRitorno.CodiceFiscale = item["CodiceFiscale"].ToString();
                    ClienteRitorno.RagioneSociale = item["RagioneSociale"].ToString();

                    if (item["CodiceTessera"].ToString() == "")
                    {
                        ClienteRitorno.Tessera = null;
                    }
                    else
                    {
                        ClienteRitorno.Tessera = new Tessera()

                        {
                            Id = (Guid)item["IdTessera"],
                            Codice = item["CodiceTessera"].ToString(),
                        };

                    }

                    ClientiRitorno.Add(ClienteRitorno);
                }
            }
            return ClientiRitorno;
        }
        #endregion
    }
}
